<?php
/**
 * 用户禁止信息表
 * 用户行为禁止：
 *    1: 禁止用户发言
 *    2: 禁止用户使用头像
 *    4: 禁止用户使用签名.
 *
 * @author xiaoxia.xu <xiaoxia.xuxx@aliyun-inc.com>
 * @copyright ©2003-2103 phpwind.com
 * @license http://www.phpwind.com
 *
 * @version $Id: PwUserBanDao.php 16415 2012-08-23 07:53:40Z xiaoxia.xuxx $
 */
class PwUserBanDao extends PwBaseDao
{
    protected $_table = 'user_ban';
    protected $_pk = 'id';
    protected $_dataStruct = array('id', 'uid', 'typeid', 'fid', 'end_time', 'created_time', 'created_userid', 'reason');

    /**
     * 获取用户ID禁止信息.
     *
     * @param int $uid
     *
     * @return array
     */
    public function getBanInfo($uid)
    {
        $sql = $this->_bindTable('SELECT * FROM %s WHERE uid = ?');
        $smt = $this->getConnection()->createStatement($sql);

        return $smt->queryAll(array($uid), 'typeid');
    }

    /**
     * 根据用户的禁止类型获取用户iD禁止信息.
     *
     * @param int $uid    用户ID
     * @param int $typeid 禁止类型
     *
     * @return array
     */
    public function getBanInfoByTypeid($uid, $typeid)
    {
        $sql = $this->_bindTable('SELECT * FROM %s WHERE uid=? AND `typeid` & ?');
        $smt = $this->getConnection()->createStatement($sql);

        return $smt->queryAll(array($uid, $typeid), 'typeid');
    }

    /**
     * 根据禁止类型及禁止类型中的具体ID获得用户uid的禁止信息.
     *
     * @param int $uid
     * @param int $typeid
     * @param int $fid
     *
     * @return array
     */
    public function getBanInfoByTypeidAndFid($uid, $typeid, $fid)
    {
        $sql = $this->_bindTable('SELECT * FROM %s WHERE uid=? AND `typeid` & ? AND `fid` IN (0, ?)');
        $smt = $this->getConnection()->createStatement($sql);

        return $smt->queryAll(array($uid, $typeid, $fid), 'typeid');
    }

    /**
     * 根据用户ID列表及版块ID获得用户禁止信息.
     *
     * @param array $uids
     * @param int   $typeid 用户禁止类型
     *
     * @return array
     */
    public function fetchBanInfoByUid($uids, $typeid)
    {
        $sql = $this->_bindSql('SELECT * FROM %s WHERE uid IN %s AND `typeid` & ?', $this->getTable(), $this->sqlImplode($uids));
        $smt = $this->getConnection()->createStatement($sql);

        return $smt->queryAll(array($typeid), 'id');
    }

    /**
     * 根据禁止ID列表获取禁止数据.
     *
     * @param array $ids
     *
     * @return array
     */
    public function fetchBanInfo($ids)
    {
        return $this->_fetch($ids, $this->_pk);
    }

    /**
     * 添加用户禁止记录.
     *
     * @param array $data 禁言信息
     *
     * @return int
     */
    public function addBanInfo($data)
    {
        if (!($data = $this->_filterStruct($data))) {
            return false;
        }
        $sql = $this->_bindSql('REPLACE INTO %s SET %s', $this->getTable(), $this->sqlSingle($data));

        return $this->getConnection()->execute($sql);
    }

    /**
     * 批量禁止用户.
     *
     * @param array $data
     *
     * @return array
     */
    public function batchAddBanInfo($data)
    {
        $clear = array();
        foreach ($data as $key => $_item) {
            if (!($_item = $this->_filterStruct($_item))) {
                continue;
            }
            $_temp = array();
            $_temp['uid'] = $_item['uid'];
            $_temp['typeid'] = $_item['typeid'];
            $_temp['fid'] = $_item['fid'];
            $_temp['end_time'] = $_item['end_time'];
            $_temp['created_time'] = $_item['created_time'];
            $_temp['created_userid'] = $_item['created_userid'];
            $_temp['reason'] = $_item['reason'];
            $clear[] = $_temp;
        }
        if (!$clear) {
            return false;
        }
        $sql = $this->_bindSql('REPLACE INTO %s (`uid`, `typeid`, `fid`, `end_time`, `created_time`, `created_userid`, `reason`) VALUES %s', $this->getTable(), $this->sqlMulti($clear));

        return $this->getConnection()->execute($sql);
    }

    /**
     * 根据禁止ID列表删除禁止记录.
     *
     * @param array $ids
     *
     * @return bool
     */
    public function batchDelete($ids)
    {
        return $this->_batchDelete($ids);
    }

    /**
     * 根据用户ID删除用户的屏蔽信息.
     *
     * @param int $uid
     *
     * @return int
     */
    public function deleteByUid($uid)
    {
        $sql = $this->_bindTable('DELETE FROM %s WHERE `uid` = ?');
        $smt = $this->getConnection()->createStatement($sql);

        return $smt->execute(array($uid));
    }

    /**
     * 根据用户ID批量删除该用户信息.
     *
     * @param array $uids 用户ID列表
     *
     * @return int
     */
    public function batchDeleteByUids($uids)
    {
        $sql = $this->_bindSql('DELETE FROM %s WHERE `uid` IN %s', $this->getTable(), $this->sqlImplode($uids));

        return $this->getConnection()->execute($sql);
    }

    /**
     * 根据条件统计数据.
     *
     * @param array $condition
     *
     * @return int
     */
    public function countByCondition($condition)
    {
        list($where, $params) = $this->_buildCondition($condition);
        $sql = $this->_bindSql('SELECT COUNT(*) FROM %s %s', $this->getTable(), $where);
        $smt = $this->getConnection()->createStatement($sql);

        return $smt->getValue($params);
    }

    /**
     * 根据条件检索数据.
     *
     * @param array $condition 查询条件
     * @param int   $limit     返回条数
     * @param int   $start     记录查询开始
     *
     * @return array
     */
    public function fetchBanInfoByCondition($condition, $limit = 10, $start = 0)
    {
        list($where, $params) = $this->_buildCondition($condition);
        $sql = $this->_bindSql('SELECT * FROM %s %s %s', $this->getTable(), $where, $this->sqlLimit($limit, $start));
        $smt = $this->getConnection()->createStatement($sql);

        return $smt->queryAll($params, 'id');
    }

    /**
     * 构建搜索条件
     * 搜索条件支持：
     * <pre>
     *   array('username/uid' => '', 'created_userid' => '', 'start_time' => '时间戳', 'end_time' => '时间戳');
     * </pre>.
     *
     * @param array $condition
     *
     * @return string
     */
    private function _buildCondition($condition)
    {
        if (!$condition) {
            return array('', array());
        }
        $where = $params = array();
        foreach ($condition as $key => $value) {
            if (!$value && $value !== 0) {
                continue;
            }
            switch ($key) {
                case 'uid':
                    $where[] = '`uid`=?';
                    $params[] = $value;
                    break;
                case 'created_userid':
                    $where[] = '`created_userid` = ?';
                    $params[] = $value;
                    break;
                case 'start_time':
                    $where[] = '`created_time` >= ?';
                    $params[] = $value;
                    break;
                case 'end_time':
                    $where[] = '`created_time` <= ?';
                    $params[] = $value;
                    break;
            }
        }

        return $where ? array(' WHERE '.implode(' AND ', $where), $params) : array('', array());
    }
}
